#include "queue.h"
QUEUE_HandleTypeDef  qVoice;
QUEUE_DATA_T  voice_buffer[Q_VOICE_BUFFER_SIZE];

//==============================================================================
//  函数声明
//==============================================================================
void Queue_Init(QUEUE_HandleTypeDef *hqueue, QUEUE_DATA_T *buffer, unsigned int len);
void Queue_Clear(QUEUE_HandleTypeDef *hqueue);
unsigned int Queue_Count(QUEUE_HandleTypeDef *hqueue);
QUEUE_StatusTypeDef Queue_Push(QUEUE_HandleTypeDef *hqueue, QUEUE_DATA_T dat);
QUEUE_StatusTypeDef Queue_Pop(QUEUE_HandleTypeDef *hqueue, QUEUE_DATA_T *pdat);

//==============================================================================
//  函数名称：Queue_Init
//  函数功能：初始化（创建）队列，每个队列必须先执行该函数才能使用。
//  函数参数：hqueue           队列变量指针
//  函数参数：buffer           队列缓存区地址
//  函数参数：len              队列缓存区长度
//  函数返回：void
//==============================================================================
void Queue_Init(QUEUE_HandleTypeDef *hqueue, QUEUE_DATA_T *buffer, unsigned int len)
{
    hqueue->buffer = buffer;
    hqueue->buffer_length = len;
    buffer[0] = 0;
    Queue_Clear(hqueue);
}

//==============================================================================
//  函数名称：Queue_Clear
//  函数功能：清空队列
//  函数参数：hqueue           队列变量指针
//  函数返回：void
//==============================================================================
void Queue_Clear(QUEUE_HandleTypeDef *hqueue)
{
    hqueue->head = 0;
    hqueue->tail = 0;
}

//==============================================================================
//  函数名称：Queue_Count
//  函数功能：获取队列内数据的个数
//  函数参数：hqueue           队列变量指针
//  函数返回：队列内数据的个数
//==============================================================================
unsigned int Queue_Count(QUEUE_HandleTypeDef *hqueue)
{
    if (hqueue->head <= hqueue->tail)
    {
        return (unsigned int)(hqueue->tail - hqueue->head);
    }
    else
    {
        return (unsigned int)(hqueue->buffer_length + hqueue->tail - hqueue->head);
    }
}

//==============================================================================
//  函数名称：Queue_Push
//  函数功能：压入数据到队列中
//  函数参数：hqueue           队列变量指针
//  函数参数：data             待压入队列的数据
//  函数返回：队列状态
//==============================================================================
QUEUE_StatusTypeDef Queue_Push(QUEUE_HandleTypeDef *hqueue, QUEUE_DATA_T dat)
{
    unsigned int tmp = (hqueue->tail + 1) % hqueue->buffer_length;

    if (tmp == hqueue->head)
    {
        return QUEUE_OVERLOAD;
    }
    else
    {
        hqueue->buffer[hqueue->tail] = dat;
        hqueue->tail = tmp;
        return QUEUE_OK;
    }
}

//==============================================================================
//  函数名称：Queue_Pop
//  函数功能：从队列中弹出数据
//  函数参数：hqueue           队列变量指针
//  函数参数：pdata            待弹出队列的数据缓存地址
//  函数返回：队列状态
//==============================================================================
QUEUE_StatusTypeDef Queue_Pop(QUEUE_HandleTypeDef *hqueue, QUEUE_DATA_T *pdat)
{
    if (hqueue->head == hqueue->tail)
    {
        return QUEUE_VOID;
    }
    else
    {
        *pdat = hqueue->buffer[hqueue->head];
        hqueue->head = (hqueue->head + 1) % hqueue->buffer_length;
        return QUEUE_OK;
    }
}
